package com.jd.risk.bankorder.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.PropertyFilter;

import java.security.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: cdfanyu
 * Date: 14-1-2
 * Time: 下午2:35
 * To change this template use File | Settings | File Templates.
 */
public class TeslaJsonUtils {

    private static final SerializeConfig config;

    static {
        config = new SerializeConfig();
        config.put(java.util.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
        config.put(java.sql.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
    }

    private static final SerializerFeature[] features = {SerializerFeature.WriteMapNullValue, // 输出空置字段
            SerializerFeature.WriteNullListAsEmpty, // list字段如果为null，输出为[]，而不是null
            SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null，输出为0，而不是null
            SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null，输出为false，而不是null
            SerializerFeature.WriteNullStringAsEmpty // 字符类型字段如果为null，输出为""，而不是null
    };


    public static String toJSONString(Object object) {
        return JSON.toJSONString(object, config);
    }

    public static String toJSONWithFeatures(Object object) {
        return JSON.toJSONString(object, config ,features);
    }



    public static Object toBean(String text) {
        return JSON.parse(text);
    }

    public static <T> T toBean(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    // 转换为数组
    public static <T> Object[] toArray(String text) {
        return toArray(text, null);
    }

    // 转换为数组
    public static <T> Object[] toArray(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz).toArray();
    }

    // 转换为List
    public static <T> List<T> toList(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz);
    }


    /**
     * * 将某一个对象中的 一部分属性 转换为json格式的字符串
     *
     * @param obj 转Json对象
     * @return 返回Json串
     */
    public static String toJson(Object obj) {
        return toJson(obj, null);
    }

    /**
     * * 将某一个对象中的 一部分属性 转换为json格式的字符串
     *
     * @param obj  转Json对象
     * @param pros 需要转换为json的属性
     * @return 返回Json串
     */
    public static String toJson(Object obj, String[] pros) {
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.registerJsonValueProcessor(Date.class, new  MyDateJsonValueProcessor());
        jsonConfig.registerJsonValueProcessor(java.sql.Date.class, new  MyDateJsonValueProcessor());
        jsonConfig.registerJsonValueProcessor(Timestamp.class, new  MyDateJsonValueProcessor());
        IgnoreFieldPropertyFilterImpl f = new  IgnoreFieldPropertyFilterImpl(pros);
        jsonConfig.setJsonPropertyFilter(f);
        String jsonStr = null;
        if (obj instanceof Collection) {
            jsonStr = JSONArray.fromObject(obj, jsonConfig).toString();
        } else {
            jsonStr = JSONObject.fromObject(obj, jsonConfig).toString();
        }
        return jsonStr;
    }


    /**
     * * 将某一个对象中的 一部分属性 转换为json格式的字符串
     *
     * @param obj  转Json对象
     * @param pros 不需要转换为json的属性
     * @return 返回Json串
     */
    public static String toJson2(Object obj, String[] pros) {
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.registerJsonValueProcessor(Date.class, new MyDateJsonValueProcessor());
        jsonConfig.registerJsonValueProcessor(java.sql.Date.class, new MyDateJsonValueProcessor());
        jsonConfig.registerJsonValueProcessor(Timestamp.class, new MyDateJsonValueProcessor());
        NotIgnoreFieldPropertyFilterImpl f = new NotIgnoreFieldPropertyFilterImpl(pros);
        jsonConfig.setJsonPropertyFilter(f);
        String jsonStr = null;
        if (obj instanceof Collection) {
            jsonStr = JSONArray.fromObject(obj, jsonConfig).toString();
        } else {
            jsonStr = JSONObject.fromObject(obj, jsonConfig).toString();
        }
        return jsonStr;
    }


}

/**
 * 处理json中日期对象   将日期输出为毫秒数
 */
class MyDateJsonValueProcessor implements net.sf.json.processors.JsonValueProcessor {

    public Object processArrayValue(Object value, JsonConfig jsonConfig) {
        if (null == value) {
            return "";
        } else {
            if (value instanceof Date || value instanceof java.sql.Date || value instanceof Timestamp) {
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return df.format(value);
            }
        }
        return value.toString();
    }

    public Object processObjectValue(String s, Object object, JsonConfig jsonConfig) {
        if (null == object) {
            return "";
        } else {

            if (object instanceof Date || object instanceof java.sql.Date || object instanceof Timestamp) {
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return df.format(object);
            }
        }
        return object.toString();
    }
}


/**
 * json属性过滤类
 */
class IgnoreFieldPropertyFilterImpl implements PropertyFilter {

    /**
     * 不需要过滤的属性名称
     */
    private String[] fields;

    public IgnoreFieldPropertyFilterImpl() {
    }

    public IgnoreFieldPropertyFilterImpl(String[] pars) {
        this.fields = pars;
    }

    public boolean apply(Object source, String name, Object value) {

        if (value == null) {     //值为空的属性 不转换为json
            return true;
        }

        if (fields == null) {     // fields为空 代表所有的非空属性都转换为json
            return false;
        }

        if (fields != null && fields.length > 0) {
            if (juge(fields, name)) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

    /**
     * 不需要过滤的属性
     *
     * @param s
     * @param s2
     * @return
     */
    public boolean juge(String[] s, String s2) {
        for (String sl : s) {
            if (s2.equals(sl)) {
                return false;
            }
        }
        return true;
    }
}

/**
 * json属性过滤类
 */
class NotIgnoreFieldPropertyFilterImpl implements PropertyFilter {

    /**
     * 不需要过滤的属性名称
     */
    private String[] fields;

    public NotIgnoreFieldPropertyFilterImpl() {
    }

    public NotIgnoreFieldPropertyFilterImpl(String[] pars) {
        this.fields = pars;
    }

    public boolean apply(Object source, String name, Object value) {

        if (value == null) {     //值为空的属性 不转换为json
            return true;
        }

        if (fields == null) {     // fields为空 代表所有的非空属性都转换为json
            return false;
        }

        if (fields != null && fields.length > 0) {
            return !juge(fields, name);
        }

        return false;
    }

    /**
     * 不需要过滤的属性
     *
     * @param s
     * @param s2
     * @return
     */
    public boolean juge(String[] s, String s2) {
        for (String sl : s) {
            if (s2.equals(sl)) {
                return false;
            }
        }
        return true;
    }
}